home *** CD-ROM | disk | FTP | other *** search
/ Games of Daze / Infomagic - Games of Daze (Summer 1995) (Disc 1 of 2).iso / x2ftp / msdos / source / demostuf / magnify1.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1994-07-25  |  5.9 KB  |  342 lines

  1. program magnify_glass;
  2. { MAGNIFY GLASS #1
  3.   - by Bjarke Viksφe
  4.   jan 1994 (before I even got my PC, really)
  5.  
  6.   THIS PROGRAM WAS CODED BY BJARKE VIKS0E.
  7.   YOU ARE FREE TO DO WHATEVER YOU WANT WITH THIS PIECE OF CODE.
  8.   E-MAIL ME AT: dat92230@rix02.lyngbyes.dk IN 1994 FOR CHAT AND CODE.
  9.  
  10.   NB: doesn't really work in protected-mode... go real-mode instead!
  11. }
  12.  
  13. const
  14.     width = 320;
  15.  
  16. type
  17.     screenpointer = ^screentype;
  18.     screentype = array [0..65530] of byte;
  19.  
  20. var
  21.    stackseg            : integer;
  22.    oldmode, oldpage : shortint;
  23.    i, j             : integer;
  24.    xtabel           : array [0..319] of integer;
  25.    ytabel           : array [0..255] of integer;
  26.  
  27.    ztabel            : array [0..64] of integer;
  28.    matrix            : array [-32..31, -32..31] of integer;
  29.    buffer            : array [0..63, 0..63] of byte;
  30.  
  31.     xpos, ypos, xadd, yadd : word;
  32.     xpostabel        : array [0..255] of integer;
  33.     ypostabel        : array [0..255] of integer;
  34.  
  35.     x,y, oldx, oldy    : integer;
  36.     screenptr        : screenpointer;
  37.  
  38.  
  39. (*-----------------------------------------------------------*)
  40.  
  41. procedure VBLANK;
  42. begin
  43.      asm
  44.      mov     dx,$3DA
  45. @vent1:
  46.      in      al,dx
  47.      test    al,8
  48.      jz      @vent1
  49. {@vent2:
  50.      in      al,dx
  51.      test    al,8
  52.      jnz     @vent2}
  53.      end;
  54. end;
  55.  
  56.  
  57. (*-----------------------------------------------------------*)
  58.  
  59. procedure SetColor(nr : integer; r,g,b : byte);
  60. begin
  61.      asm
  62.      mov    bx,nr
  63.      mov    cl,r
  64.      mov    ch,g
  65.      mov    dh,b
  66.      mov    ax,$1010
  67.      int    $10
  68.      end;
  69. end;
  70.  
  71. procedure OpenScreen;
  72. var
  73.    i, color : integer;
  74. begin
  75.     asm
  76.     mov     ah,$0F
  77.     int     $10
  78.      mov     oldmode,al
  79.  
  80.     mov     al,$13
  81.     xor     ah,ah
  82.     int     $10
  83.     end;
  84.  
  85.     color := 0;
  86.     for i:=1 to 63 do
  87.     begin
  88.          SetColor(i, color,color,color);
  89.          inc(color);
  90.     end;
  91.     for i:=64 to 127 do
  92.     begin
  93.          SetColor(i, color,color,color);
  94.          dec(color);
  95.     end;
  96. end;
  97.  
  98. procedure CloseScreen;
  99. begin
  100.      asm
  101.      mov    al,oldmode
  102.      xor    ah,ah
  103.      int    $10
  104.      end;
  105. end;
  106.  
  107. (*-----------------------------------------------------------*)
  108.  
  109. procedure MakePattern(value : byte);
  110. var
  111.     ytaller : integer;
  112. begin
  113.     ytaller := 200;
  114.     asm
  115.     mov     ax,$A000
  116.     mov     es,ax
  117.     mov     si,0
  118.  
  119.     mov     cl,value
  120.     mov        ch,127
  121. @yloop:
  122.     mov     dl,160
  123.     lea     di,xtabel
  124. @xloop1:
  125.     mov     bx,WORD PTR ytabel
  126.     add     bx,[di]
  127.     mov     ax,bx
  128.     shr     ax,cl
  129.     and     al,ch
  130.     mov     [es:si],al
  131.     inc     si
  132.     inc     di
  133.     inc     di
  134.  
  135. @xloop2:
  136.     mov     bx,WORD PTR ytabel
  137.     add     bx,[di]
  138.     mov     ax,bx
  139.     shr     ax,cl
  140.     and     al,ch
  141.     mov     [es:si],al
  142.     inc     si
  143.     inc     di
  144.     inc     di
  145.     dec     dl
  146.     jnz     @xloop1
  147.  
  148.     add     WORD PTR @xloop1+2,2
  149.     add     WORD PTR @xloop2+2,2
  150.     dec     ytaller
  151.     jnz     @yloop
  152.  
  153.     lea     si,ytabel
  154.     mov     WORD PTR @xloop1+2, si
  155.     mov     WORD PTR @xloop2+2, si
  156.     end;
  157. end;
  158.  
  159.  
  160. (*-----------------------------------------------------------*)
  161.  
  162. procedure CalcMatrix;
  163. var
  164.     x,y,z : longint;
  165.     tx,ty : longint;
  166. begin
  167.     for y:=-32 to 31 do
  168.     begin
  169.         for x:=-32 to 31 do
  170.         begin
  171.             z := round(sqrt(sqr(x*2)+sqr(y*2)));
  172.             z := ztabel[z shr 1];
  173.             tx := (x*z) DIV 2300;
  174.             ty := (y*z) DIV 2300;
  175.             matrix[y,x] := (ty*320)+tx;
  176.         end;
  177.     end;
  178. end;
  179.  
  180.  
  181. (*-----------------------------------------------------------*)
  182.  
  183. procedure CopyScreen;
  184. begin
  185.     asm
  186.     push    ds
  187.     mov        ax,WORD PTR screenptr+2
  188.     mov        di,WORD PTR screenptr
  189.     mov        es,ax
  190.     mov        ax,$A000
  191.     mov        ds,ax
  192.     xor        si,si
  193.     cld
  194.     mov        cx,64000
  195.     rep movsb
  196.     pop        ds
  197.     end;
  198. end;
  199.  
  200.  
  201. (*-----------------------------------------------------------*)
  202.  
  203. procedure SetupDemo;
  204. var
  205.     i : integer;
  206.     v, vadd : real;
  207. begin
  208.      for i:=0 to 319 do
  209.          xtabel[i]:=sqr(i-160);
  210.      for i:=0 to 199 do
  211.          ytabel[i]:=sqr(i-100);
  212.  
  213.     v:=0.0;
  214.     vadd:=(2.0*pi/256.0);
  215.     for i:=0 to 255 do
  216.     begin
  217.         xpostabel[i]:=round(sin(v)*110)+160;
  218.         v:=v+vadd;
  219.     end;
  220.     v:=0.0;
  221.     vadd:=(2.0*pi/256.0);
  222.     for i:=0 to 255 do
  223.     begin
  224.         ypostabel[i]:=round(sin(v)*50)+100;
  225.         v:=v+vadd;
  226.     end;
  227.  
  228.     v:=pi/2.0;
  229.     vadd:=(pi/2.0)/64.0;
  230.     for i:=0 to 64 do
  231.     begin
  232.         ztabel[i]:=round(sin(v)*2500);
  233.         v:=v+vadd;
  234.     end;
  235.     CalcMatrix;
  236.     MakePattern(4);
  237.     CopyScreen;
  238. end;
  239.  
  240. (*-----------------------------------------------------------*)
  241.  
  242. procedure CopyFrombuffer(x,y : integer);
  243. begin
  244.     asm
  245.     push    ds
  246.     mov        ax,y
  247.     mov     dx,width
  248.     mul        dx
  249.     add        ax,x
  250.     mov        di,ax
  251.     mov        si,ax
  252.     add        si,WORD PTR screenptr
  253.  
  254.     mov        ax,WORD PTR screenptr+2
  255.     mov        ds,ax
  256.     mov        ax,$A000
  257.     mov        es,ax
  258.  
  259.     sub        si,(32*320)+32
  260.     sub        di,(32*320)+32
  261.     cld
  262.     mov        ax,320-64
  263.     mov        dx,64
  264. @copy:
  265.     mov        cx,64
  266.     rep movsb
  267.     add        si,ax
  268.     add        di,ax
  269.     dec        dx
  270.     jnz        @copy
  271.  
  272.     pop        ds
  273.     end;
  274. end;
  275.  
  276.  
  277. procedure PrintMagnifyGlass(x,y : integer);
  278. begin
  279.     asm
  280.     mov        stackseg,ss
  281.     mov        ax,y
  282.     mov     dx,width
  283.     mul        dx
  284.     add        ax,x
  285.     mov        dx,ax
  286.     mov        di,ax
  287.     sub        di,(64*320)+64
  288.  
  289.     mov        ax,$A000
  290.     mov        es,ax
  291.  
  292.     lea        si,matrix
  293.     mov        ax,WORD PTR screenptr+2
  294.     add        di,WORD PTR screenptr
  295.     mov        ss,ax
  296.     mov        ah,64
  297. @loop1:
  298.     mov        cx,64
  299. @loop2:
  300.     mov        bx,[si]
  301.     add        bx,dx
  302.     mov        al,[ss:di]
  303.     mov        [es:bx],al
  304.     add        di,2
  305.     add        si,2
  306.     loop    @loop2
  307.  
  308.     add        di,640-128
  309.     dec        ah
  310.     jnz        @loop1
  311.     mov        ss,stackseg
  312.     end;
  313. end;
  314.  
  315.  
  316. (*-----------------------------------------------------------*)
  317.  
  318. begin
  319.     new(screenptr);
  320.     OpenScreen;
  321.     SetupDemo;
  322.  
  323.     xpos :=40; ypos:=20;
  324.     xadd :=2; yadd:=1;
  325.  
  326.     for i:=1 to 1600 do
  327.     begin
  328.         VBLANK;
  329.         CopyFromBuffer(oldx,oldy);
  330.         x := xpostabel[xpos mod 256];
  331.         y := ypostabel[ypos mod 256];
  332.         PrintMagnifyGlass(x,y);
  333.  
  334.         oldx := x; oldy := y;
  335.         inc(xpos,xadd);
  336.         inc(ypos,yadd);
  337.     end;
  338.  
  339.     CloseScreen;
  340.     dispose(screenptr);
  341. end.
  342.